﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using MyControlLibrary;
using System.Drawing.Imaging;
using System.Threading;
using AForge.Imaging;

namespace GIMP
{
    // delegate para o evento de incremento da progress bar.
    delegate void DelegateProgressBar(int i);

    public partial class Form1 : Form
    {
        // Lista de imagens carregadas.
        List<ImagemZoom> imagens = null;

        private Point clique = Point.Empty;

        public Form1()
        {
            //new Loader().Run();
            InitializeComponent();
        }

        public void DelegateBarraProgresso(int i)
        {
            this.toolStripProgressBar1.Increment(i);
        }

        private void CarregaImagem(Bitmap imagem, string nome_imagem)
        {
            if (this.imagens == null)
                this.imagens = new List<ImagemZoom>();

            ImagemZoom newImage = new ImagemZoom(imagem, nome_imagem);
            this.imagens.Add(newImage);

            TabPage myTabPage = new TabPage(nome_imagem + "       ");
            PictureBox box = new PictureBox();
            box.Size = this.imagens.Last().Imagem.Size;
            box.Image = this.imagens.Last().Imagem;
            newImage.ClientRectangle = new Rectangle(new Point(0, 0), newImage.Imagem.Size);
            // evento mouse.
            box.MouseMove += new MouseEventHandler(imagem_MouseMove);
            box.MouseClick += new MouseEventHandler(imagem_MouseClick);

            myTabPage.AutoScrollMinSize = this.imagens.Last().Imagem.Size;
            myTabPage.Controls.Add(box);
            box.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;

            tabControl1.TabPages.Add(myTabPage);
            tabControl1.SelectedTab = myTabPage;

            this.label_number_zoom.Text = "100%";
        }

        void form_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.tabControl1.TabCount > 0)
            {
                ImagemZoom img = this.imagens.ElementAt(this.tabControl1.SelectedIndex);
                Rectangle rc = this.ClientRectangle;
                if (rc.Contains(e.Location))
                {
                    this.Cursor = Cursors.Default;
                    this.selectionPanel.Text = "";
                    this.colorPanel.Text = "";
                }
            }
        }

        void imagem_MouseClick(object sender, MouseEventArgs e)
        {
            if (this.tabControl1.TabCount > 0)
            {
                ImagemZoom img = this.imagens.ElementAt(this.tabControl1.SelectedIndex);
                Rectangle rc = img.ClientRectangle;
                if (rc.Contains(e.Location))
                {
                    this.clique = e.Location;
                    Color color = img.Imagem.GetPixel(e.X, e.Y);
                    MessageBox.Show(color.ToString(), "RGB Obtido", MessageBoxButtons.OK);
                }
            }
        }

        private void imagem_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.tabControl1.TabCount > 0)
            {
                ImagemZoom img = this.imagens.ElementAt(this.tabControl1.SelectedIndex);

                TabPage tab = this.tabControl1.SelectedTab;
                Rectangle rc = img.ClientRectangle;
                int width = (int)(img.Imagem.Width * img.Zoom);
                int height = (int)(img.Imagem.Height * img.Zoom);
                int x = (rc.Width < width) ? this.AutoScrollPosition.X : (rc.Width - width) / 2;
                int y = (rc.Height < height) ? this.AutoScrollPosition.Y : (rc.Height - height) / 2;

                if ((e.X >= x) && (e.Y >= y) && (e.X < x + width) && (e.Y < y + height) && (rc.Contains(e.Location)))
                {
                    // o mouse está sobre a região imagem
                    MouseImagePosition(new Point((int)((e.X - x) / img.Zoom), (int)((e.Y - y) / img.Zoom)));
                }
                else
                {
                    // o mouse está fora da região da imagem
                    MouseImagePosition(new Point(-1, -1));
                }
            }

        }

        /**
         * Método que verifica se o mouse está sobre a imagem,
         * se sim, ele mostra informações como a cor e a posição do pixel.
         * 
         * @param name="p" - posição do mouse.
         */
        private void MouseImagePosition(Point p)
        {
            if (p.X >= 0 && p.Y >= 0)
            {
                this.Cursor = Cursors.Cross;
                // pixel(x,y)
                this.selectionPanel.Text = string.Format("({0}, {1})", p.X, p.Y);

                // get current color
                Bitmap image = this.imagens.ElementAt(this.tabControl1.SelectedIndex).Imagem;
                Color color = image.GetPixel(p.X, p.Y);
                // RGB
                this.colorPanel.Text = string.Format("RGB: ({0}, {1}, {2})", color.R, color.G, color.B);
            }
            else
            {
                this.Cursor = Cursors.Default;
                this.selectionPanel.Text = "";
                this.colorPanel.Text = "";
            }
        }

        private void AbrirImagem(object sender, EventArgs e)
        {
            if (open_file.ShowDialog() == DialogResult.OK)
            {
                string filename = open_file.SafeFileName;
                this.CarregaImagem(new Bitmap(open_file.FileName), (filename.Length > 7) ? (filename.Substring(0, 7) + ".." + filename.Substring(filename.Length - 4)) : filename);
            }
        }

        private void SalvarAquivoIcon(object sender, EventArgs e)
        {
            if (this.tabControl1.TabCount > 0)
            {
                this.SalvarImagem(this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem);
            }
        }

        private bool SalvarImagem(Bitmap imagem)
        {
            if (this.save_file.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    imagem.Save(save_file.FileName);
                    string[] filename_path = save_file.FileName.Split('\\');
                    string filename = filename_path[filename_path.Length - 1];

                    this.tabControl1.SelectedTab.Text = ((filename.Length > 7)
                        ? (filename.Substring(0, 7) + ".."
                        + filename.Substring(filename.Length - 4))
                        : filename) + "       ";
                }
                catch
                {
                    MessageBox.Show("Houve algum erro e a imagem não pode ser salva.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return false;
                }
            }
            else
            {
                return false;
            }
            return true;
        }

        private void comando_FecharAba(object sender, KeyEventArgs e)
        {
            if ((e.Modifiers == (System.Windows.Forms.Keys.Control)) && (tabControl1.TabCount > 0))
            {
                if (e.KeyCode == System.Windows.Forms.Keys.W)
                {
                    this.SalvarAlteracoesImagem();
                }
            }
        }

        private void SalvarAlteracoesImagem()
        {
            if (tabControl1.SelectedTab.Text.Contains("*new"))
            {
                DialogResult action = MessageBox.Show("Deseja salvar as alterações?",
                    "Salvar", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

                if ((action == DialogResult.No)
                    || ((action == DialogResult.Yes)
                    && (this.SalvarImagem(this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem))))
                {
                    this.imagens.RemoveAt(this.tabControl1.SelectedIndex);
                    this.tabControl1.SelectedTab.Dispose();
                }
            }
            else
            {
                this.imagens.RemoveAt(this.tabControl1.SelectedIndex);
                this.tabControl1.SelectedTab.Dispose();
            }
        }

        private void SalvarAlteracao(object sender, CloseEventArgs e)
        {
            if (tabControl1.SelectedTab.Text.Contains("*new"))
            {
                if ((e.DialogCloseTab == DialogResult.No)
                    || ((e.DialogCloseTab == DialogResult.Yes)
                    && (this.SalvarImagem(this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem))))
                {
                    this.imagens.RemoveAt(this.tabControl1.SelectedIndex);
                    tabControl1.SelectedTab.Dispose();
                }
            }
            else
            {
                this.imagens.RemoveAt(this.tabControl1.SelectedIndex);
                tabControl1.SelectedTab.Dispose();
            }
        }

        private void AumentaZoom(object sender, EventArgs e)
        {
            if ((this.imagens.ElementAt(this.tabControl1.SelectedIndex).Zoom < 5) && (this.tabControl1.TabCount > 0))
            {
                ImagemZoom imagem = this.imagens.ElementAt(this.tabControl1.SelectedIndex);
                imagem.Zoom += .25;
                this.label_number_zoom.Text = Convert.ToString(imagem.Zoom * 100) + "%";

                Size size = new Size((int)(imagem.Imagem.Width * imagem.Zoom),
                    (int)(imagem.Imagem.Height * imagem.Zoom));

                imagem.ClientRectangle = new Rectangle(new Point(0, 0), size);

                PictureBox box = (PictureBox)this.tabControl1.SelectedTab.GetChildAtPoint(new Point(0, 0));
                box.Image = new Bitmap(imagem.Imagem, size);
                this.tabControl1.SelectedTab.AutoScrollMinSize = size;
            }
        }

        private void DiminuiZoom(object sender, EventArgs e)
        {
            if ((this.imagens.ElementAt(this.tabControl1.SelectedIndex).Zoom > .25) && (this.tabControl1.TabCount > 0))
            {
                ImagemZoom imagem = this.imagens.ElementAt(this.tabControl1.SelectedIndex);
                imagem.Zoom -= .25;
                this.label_number_zoom.Text = Convert.ToString(imagem.Zoom * 100) + "%";

                Size size = new Size((int)(imagem.Imagem.Width * imagem.Zoom),
                    (int)(imagem.Imagem.Height * imagem.Zoom));

                imagem.ClientRectangle = new Rectangle(new Point(0, 0), size);

                PictureBox box = (PictureBox)this.tabControl1.SelectedTab.GetChildAtPoint(new Point(0, 0));
                box.Image = new Bitmap(imagem.Imagem, size);
                this.tabControl1.SelectedTab.AutoScrollMinSize = size;
            }
        }

        private void ConfiguraZoomAba(object sender, EventArgs e)
        {
            if (this.tabControl1.SelectedIndex > -1)
                this.label_number_zoom.Text = Convert.ToString(this.imagens.ElementAt(this.tabControl1.SelectedIndex).Zoom * 100) + "%";
        }

        private void ParaPretoBranco(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                this.status_label.Text = "Ultima ação: escala de cinza.";
                this.toolStripProgressBar1.Value = 0;
                this.toolStripProgressBar1.Maximum = imagem.Width;
                this.CarregaImagem(PI.PretoBranco(imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
            }
        }

        private void ParaAjusteBrilho(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                AjustarBrilho janela_brilho = new AjustarBrilho();
                if (janela_brilho.ShowDialog() == DialogResult.OK)
                {
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    this.status_label.Text = "Ultima ação: ajuste de brilho.";
                    this.toolStripProgressBar1.Value = 0;
                    this.toolStripProgressBar1.Maximum = imagem.Width;
                    this.CarregaImagem(PI.AjusteBrilho(imagem, janela_brilho.GetBrilho(), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                }
            }
        }

        private void ParaAjusteContraste(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                AjustarContraste janela_contraste = new AjustarContraste();
                if (janela_contraste.ShowDialog() == DialogResult.OK)
                {
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    this.status_label.Text = "Ultima ação: ajuste de contraste.";
                    this.toolStripProgressBar1.Value = 0;
                    this.toolStripProgressBar1.Maximum = imagem.Width;
                    this.CarregaImagem(PI.AjusteContraste(imagem, janela_contraste.GetContraste(), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                }
            }
        }

        private void ParaNegativo(object sender, EventArgs e)
        {
            if (this.tabControl1.TabCount > 0)
            {
                Bitmap imagem = this.imagens.ElementAt(this.tabControl1.SelectedIndex).Imagem;
                this.status_label.Text = "Ultima ação: negativo.";
                this.toolStripProgressBar1.Value = 0;
                this.toolStripProgressBar1.Maximum = imagem.Width;
                this.CarregaImagem(PI.Negativo(imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
            }
        }

        private void ParaSoma(object sender, EventArgs e)
        {
            SelecionaImagens janela_soma;
            if (this.tabControl1.TabCount > 0)
            {
                janela_soma = new SelecionaImagens(this.imagens);
                if (janela_soma.ShowDialog() == DialogResult.OK)
                {
                    List<int> list_checked = janela_soma.CheckedIndices;
                    if (list_checked.Count > 0)
                    {
                        Bitmap imagem1 = new Bitmap(this.imagens.ElementAt(list_checked[0]).Imagem);
                        if (list_checked.Count > 1)
                        {
                            list_checked.RemoveAt(0);
                            foreach (int i in list_checked)
                            {
                                Bitmap imagem2 = this.imagens.ElementAt(i).Imagem;
                                this.toolStripProgressBar1.Value = 0;
                                this.toolStripProgressBar1.Maximum = (imagem1.Width > imagem2.Width) ? imagem2.Width : imagem1.Width;
                                imagem1 = PI.Soma(imagem1, imagem2, new DelegateProgressBar(DelegateBarraProgresso));
                            }
                        }
                        else
                        {
                            this.toolStripProgressBar1.Value = 0;
                            this.toolStripProgressBar1.Maximum = imagem1.Width;
                            imagem1 = PI.Soma(imagem1, imagem1, new DelegateProgressBar(DelegateBarraProgresso));
                        }
                        this.CarregaImagem(imagem1, "*new");
                        this.status_label.Text = "Ultima ação: soma de imagem.";
                    }
                }
            }
        }

        private void ParaHistograma(object sender, EventArgs e)
        {
            if (this.tabControl1.TabCount > 0)
            {
                Histograma janela_histo = new Histograma(this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem);
                if (janela_histo.ShowDialog() == DialogResult.OK)
                {
                    this.CarregaImagem(PI.EqualizacaoHistograma(this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                    this.status_label.Text = "Ultima ação: equalização do histograma.";
                }
            }
        }

        private void ParaMedia(object sender, EventArgs e)
        {
            SelecionaImagens janela;
            if (this.tabControl1.TabCount > 0)
            {
                janela = new SelecionaImagens(this.imagens);
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    List<int> list_checked = janela.CheckedIndices;
                    if (list_checked.Count > 0)
                    {
                        Bitmap imagem1 = new Bitmap(this.imagens.ElementAt(list_checked[0]).Imagem);
                        if (list_checked.Count > 1)
                        {
                            list_checked.RemoveAt(0);
                            foreach (int i in list_checked)
                            {
                                Bitmap imagem2 = this.imagens.ElementAt(i).Imagem;
                                this.toolStripProgressBar1.Value = 0;
                                this.toolStripProgressBar1.Maximum = (imagem1.Width > imagem2.Width) ? imagem2.Width : imagem1.Width;
                                imagem1 = PI.Media(imagem1, imagem2, new DelegateProgressBar(DelegateBarraProgresso));
                            }
                        }
                        else
                        {
                            this.toolStripProgressBar1.Value = 0;
                            this.toolStripProgressBar1.Maximum = imagem1.Width;
                            imagem1 = PI.Media(imagem1, imagem1, new DelegateProgressBar(DelegateBarraProgresso));
                        }
                        this.CarregaImagem(imagem1, "*new");
                        this.status_label.Text = "Ultima ação: média entre imagens.";
                    }
                }
            }
        }

        private void ParaSubtracao(object sender, EventArgs e)
        {
            SelecionaImagens janela;
            if (this.tabControl1.TabCount > 0)
            {
                janela = new SelecionaImagens(this.imagens);
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    List<int> list_checked = janela.CheckedIndices;
                    if (list_checked.Count > 0)
                    {
                        Bitmap imagem1 = new Bitmap(this.imagens.ElementAt(list_checked[0]).Imagem);
                        if (list_checked.Count > 1)
                        {
                            list_checked.RemoveAt(0);
                            foreach (int i in list_checked)
                            {
                                Bitmap imagem2 = this.imagens.ElementAt(i).Imagem;
                                this.toolStripProgressBar1.Value = 0;
                                this.toolStripProgressBar1.Maximum = (imagem1.Width > imagem2.Width) ? imagem2.Width : imagem1.Width;
                                imagem1 = PI.Subtracao(imagem1, imagem2, new DelegateProgressBar(DelegateBarraProgresso));
                            }
                        }
                        else
                        {
                            this.toolStripProgressBar1.Value = 0;
                            this.toolStripProgressBar1.Maximum = imagem1.Width;
                            imagem1 = PI.Subtracao(imagem1, imagem1, new DelegateProgressBar(DelegateBarraProgresso));
                        }
                        this.CarregaImagem(imagem1, "*new");
                        this.status_label.Text = "Ultima ação: subtracao entre imagens.";
                    }
                }
            }
        }

        private void ParaOr(object sender, EventArgs e)
        {
            SelecionaImagens janela;
            if (this.tabControl1.TabCount > 0)
            {
                janela = new SelecionaImagens(this.imagens);
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    List<int> list_checked = janela.CheckedIndices;
                    if (list_checked.Count > 0)
                    {
                        Bitmap imagem1 = new Bitmap(this.imagens.ElementAt(list_checked[0]).Imagem);
                        if (list_checked.Count > 1)
                        {
                            list_checked.RemoveAt(0);
                            foreach (int i in list_checked)
                            {
                                Bitmap imagem2 = this.imagens.ElementAt(i).Imagem;
                                this.toolStripProgressBar1.Value = 0;
                                this.toolStripProgressBar1.Maximum = (imagem1.Width > imagem2.Width) ? imagem2.Width : imagem1.Width;
                                imagem1 = PI.Or(imagem1, imagem2, new DelegateProgressBar(DelegateBarraProgresso));
                            }
                        }
                        else
                        {
                            this.toolStripProgressBar1.Value = 0;
                            this.toolStripProgressBar1.Maximum = imagem1.Width;
                            imagem1 = PI.Or(imagem1, imagem1, new DelegateProgressBar(DelegateBarraProgresso));
                        }
                        this.CarregaImagem(imagem1, "*new");
                        this.status_label.Text = "Ultima ação: or entre imagens.";
                    }
                }
            }
        }

        private void ParaAnd(object sender, EventArgs e)
        {
            SelecionaImagens janela;
            if (this.tabControl1.TabCount > 0)
            {
                janela = new SelecionaImagens(this.imagens);
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    List<int> list_checked = janela.CheckedIndices;
                    if (list_checked.Count > 0)
                    {
                        Bitmap imagem1 = new Bitmap(this.imagens.ElementAt(list_checked[0]).Imagem);
                        if (list_checked.Count > 1)
                        {
                            list_checked.RemoveAt(0);
                            foreach (int i in list_checked)
                            {
                                Bitmap imagem2 = this.imagens.ElementAt(i).Imagem;
                                this.toolStripProgressBar1.Value = 0;
                                this.toolStripProgressBar1.Maximum = (imagem1.Width > imagem2.Width) ? imagem2.Width : imagem1.Width;
                                imagem1 = PI.And(imagem1, imagem2, new DelegateProgressBar(DelegateBarraProgresso));
                            }
                        }
                        else
                        {
                            this.toolStripProgressBar1.Value = 0;
                            this.toolStripProgressBar1.Maximum = imagem1.Width;
                            imagem1 = PI.And(imagem1, imagem1, new DelegateProgressBar(DelegateBarraProgresso));
                        }
                        this.CarregaImagem(imagem1, "*new");
                        this.status_label.Text = "Ultima ação: or entre imagens.";
                    }
                }
            }
        }

        private void ParaLimiarizacao(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                AjustarLimiar janela_limiar = new AjustarLimiar();
                if (janela_limiar.ShowDialog() == DialogResult.OK)
                {
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    this.status_label.Text = "Ultima ação: Limiarização.";
                    this.toolStripProgressBar1.Value = 0;
                    this.toolStripProgressBar1.Maximum = imagem.Width;
                    this.CarregaImagem(PI.Limiarizacao(imagem, janela_limiar.GetLimiar(), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                }
            }
        }

        private void ParaLimiarizacaoDV(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                if (this.clique.IsEmpty)
                {
                    MessageBox.Show("Nenhum pixel foi obtido. Clique na imagem para obtê-lo.", "Pixel não obtido", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else
                {
                    AjustarLimiarDV janela_limiar = new AjustarLimiarDV();
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    Color pixel = imagem.GetPixel(this.clique.X, this.clique.Y);
                    janela_limiar.numericUpDownR.Value = pixel.R;
                    janela_limiar.numericUpDownG.Value = pixel.G;
                    janela_limiar.numericUpDownB.Value = pixel.B;
                    if (janela_limiar.ShowDialog() == DialogResult.OK)
                    {
                        this.status_label.Text = "Ultima ação: LimiarizaçãoDV.";
                        this.toolStripProgressBar1.Value = 0;
                        this.toolStripProgressBar1.Maximum = imagem.Width;
                        Color pixel_clique = Color.FromArgb(Decimal.ToInt32(janela_limiar.numericUpDownR.Value), Decimal.ToInt32(janela_limiar.numericUpDownG.Value), Decimal.ToInt32(janela_limiar.numericUpDownB.Value));
                        this.CarregaImagem(PI.LimiarizacaoDV(imagem, pixel_clique, janela_limiar.GetLimiar(), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                    }
                }
            }
        }

        private void ParaCrescimentoRegioes(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                if (this.clique.IsEmpty)
                {
                    MessageBox.Show("Nenhum pixel foi obtido. Clique na imagem para obtê-lo.", "Pixel não obtido", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else
                {
                    AjustarLimiar janela_limiar = new AjustarLimiar();
                    janela_limiar.Text = "Crescimento de Regiões";
                    janela_limiar.label1.Text = "Valor:";
                    if (janela_limiar.ShowDialog() == DialogResult.OK)
                    {
                        Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                        this.status_label.Text = "Ultima ação: Crescimento de Regiões.";
                        this.toolStripProgressBar1.Value = 0;
                        this.toolStripProgressBar1.Maximum = imagem.Width;
                        this.CarregaImagem(PI.CrescimentoRegioes(imagem, this.clique, janela_limiar.GetLimiar(), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                    }
                }
            }
        }

        private void ParaFiltroMedia(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Mediana janela = new Mediana();
                janela.Text = "Filtro Média";
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    this.status_label.Text = "Ultima ação: Filtro Média.";
                    this.toolStripProgressBar1.Value = 0;
                    this.toolStripProgressBar1.Maximum = imagem.Width;
                    this.CarregaImagem(PI.FiltroMedia(imagem, Decimal.ToInt32(janela.txtW.Value), Decimal.ToInt32(janela.txtH.Value), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                }
            }
        }

        private void ParaFiltroMediana(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Mediana janela = new Mediana();
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    this.status_label.Text = "Ultima ação: Filtro Mediana.";
                    this.toolStripProgressBar1.Value = 0;
                    this.toolStripProgressBar1.Maximum = imagem.Width;
                    this.CarregaImagem(PI.FiltroMediana(imagem, Decimal.ToInt32(janela.txtW.Value), Decimal.ToInt32(janela.txtH.Value), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                }
            }
        }

        private void ParaFiltroPassaAlta(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                this.status_label.Text = "Ultima ação: Filtro Passa Alta.";
                this.toolStripProgressBar1.Value = 0;
                this.toolStripProgressBar1.Maximum = imagem.Width;
                this.CarregaImagem(PI.FiltroPassaAltaBasico(imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
            }
        }

        private void ParaFiltroAltoReforco(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                AltoReforco janela = new AltoReforco();
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                    this.status_label.Text = "Ultima ação: Filtro Alto Reforço.";
                    this.toolStripProgressBar1.Value = 0;
                    this.toolStripProgressBar1.Maximum = imagem.Width;
                    this.CarregaImagem(PI.FiltroAltoReforco(imagem, janela.GetFator(), new DelegateProgressBar(DelegateBarraProgresso)), "*new");
                }
            }
        }

        private void ParaFiltroSobel(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                this.status_label.Text = "Ultima ação: Filtro Sobel.";
                this.toolStripProgressBar1.Value = 0;
                this.toolStripProgressBar1.Maximum = imagem.Width;
                this.CarregaImagem(PI.FiltroSobel(imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
            }
        }

        private void ParaFiltroPrewitt(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                this.status_label.Text = "Ultima ação: Filtro Prewitt.";
                this.toolStripProgressBar1.Value = 0;
                this.toolStripProgressBar1.Maximum = imagem.Width;
                this.CarregaImagem(PI.FiltroPrewitt(imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
            }
        }

        private void ParaFiltroRoberts(object sender, EventArgs e)
        {
            if (tabControl1.TabCount > 0)
            {
                Bitmap imagem = this.imagens.ElementAt(tabControl1.SelectedIndex).Imagem;
                this.status_label.Text = "Ultima ação: Filtro Roberts.";
                this.toolStripProgressBar1.Value = 0;
                this.toolStripProgressBar1.Maximum = imagem.Width;
                this.CarregaImagem(PI.FiltroRoberts(imagem, new DelegateProgressBar(DelegateBarraProgresso)), "*new");
            }
        }

    }

    /**
     * Classe que representa a Imagem, onde são armazedas informações
     * como: Zoom e nome.
     */
    public class ImagemZoom
    {
        private Bitmap imagem = null;

        private Rectangle rec_image = Rectangle.Empty;

        private double zoom = 1.0;

        private string name = string.Empty;

        /**
         * O objeto ImagemZoom é instanciado obrigatoriamente contendo
         * a Imagem e seu respectivo nome.
         */
        public ImagemZoom(Bitmap imagem, string name)
        {
            this.imagem = imagem;
            this.name = name;
        }

        /**
         * Método de acesso a imagem.
         * 
         * @value Bitmap.
         */
        public Bitmap Imagem
        {
            get
            {
                return this.imagem;
            }
            set
            {
                this.imagem = value;
            }
        }

        /**
         * Método de acesso ao Rentagulo representativo da imagem
         * 
         * @value Rectangle.
         */
        public Rectangle ClientRectangle
        {
            get
            {
                return this.rec_image;
            }
            set
            {
                this.rec_image = value;
            }
        }

        /**
         * Método de acesso à porcetagem de zoom.
         * 
         * @value double.
         */
        public double Zoom
        {
            get
            {
                return this.zoom;
            }
            set
            {
                this.zoom = value;
            }
        }

        /**
         * Método de acesso ao nome da imagem.
         * 
         * @value string.
         */
        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }
    }
}



